首次!让我们出一个基于延迟的同行 IP 库数据评估来打个样~
由于我们的某位客户工作非常繁忙,所以希望我们出一个样本报告,初步以国家级别的就可以,来证明一下我们和同行数据的情况,以便他和他的同事和领导进行质量方面的评估。当然,他们后期也会基于自身的需求进行相关数据的采集和评估,比如他们比较关心的国家。
这个需求挺多客户都有的。
所以我抽了一点时间做了这个事情,既然做了,正好也可以公开出来吧。并且顺带优化了一下我们自己的 IPDB 数据库的 PHP 读取代码。还是要吐槽一下同行的执行效率,实在是太差了。
测试数据情况如下:
原始数据取自我们香港专门用于延迟监测用途的节点数据,监测数据跨度大概是在 10 天左右,原始数据一共 89100048 个。只保留 14ms 以下的数据,过滤后的结果是 2105716 个。
根据我们的经验,我们认为从香港节点为中心点,RTT 延迟为 14ms 以内的 IP,理论上都应该也只会包括中国大陆以及港澳台地区的地区(延迟超过 14ms 就有可能到达菲律宾北部的网络路径直连香港的 IP 了),而凡是不属于中国的 IP 的标注,都可以认为是错误的,没有例外。因为监测数据有自身的检测周期,所以有一定量的小数量看似错误的标注,其中也包括一些卫星网络地面站的 IP,不一定算是真的错误。
跑完的结果如下:
同行 MXXXXXX 的数据情况,执行耗时 1800 秒左右:
美国 => 912112
中国 => 577123
其它 => 189564
南非 => 161373
新加坡 => 123502
塞舌尔 => 83055
毛里求斯 => 10374
荷兰 => 5817
英国 => 4938
伊朗 => 4712
澳大利亚 => 3208
加拿大 => 2914
德国 => 2796
俄罗斯联邦 => 2186
韩国 => 1981
英属维尔京群岛 => 1977
马来西亚 => 1636
日本 => 1438
塞浦路斯 => 1360
伯利兹 => 1202
捷克 => 1160
印度 => 1134
罗马尼亚 => 1000
爱尔兰 => 975
乌克兰 => 948
瑞士 => 650
法国 => 628
波兰 => 556
保加利亚 => 536
卢森堡 => 535
奥地利 => 528
亚美尼亚 => 523
库拉索 => 517
瑞典 => 355
哈萨克斯坦 => 283
丹麦 => 282
西班牙 => 274
爱沙尼亚 => 170
印度尼西亚 => 150
以色列 => 140
智利 => 138
直布罗陀 => 136
柬埔寨 => 126
菲律宾 => 98
阿联酋 => 90
越南 => 88
沙特阿拉伯 => 64
挪威 => 51
葡萄牙 => 34
芬兰 => 32
新西兰 => 31
泰国 => 29
意大利 => 29
蒙古 => 28
瓦努阿图 => 26
比利时 => 21
格鲁吉亚 => 19
孟加拉国 => 18
伊拉克 => 14
摩尔多瓦 => 11
斯洛文尼亚 => 9
肯尼亚 => 3
老挝 => 2
巴西 => 2
关岛 => 2
文莱 => 1
立陶宛 => 1
墨西哥 => 1
备注:其中的“其它”数据项为标注国家为空的情况。
另一个同行 IP2XXXXXXXX 的数据情况,执行耗时 135 秒左右(内存缓存模式 30 秒左右):
中国 => 1137247
美国 => 864954
南非 => 18816
比利时 => 10274
荷兰 => 9058
英国 => 7284
日本 => 7094
新加坡 => 6044
德国 => 4880
韩国 => 4810
加拿大 => 4518
伊朗 => 4157
巴西 => 2575
澳大利亚 => 2541
俄罗斯 => 2495
芬兰 => 2441
伯利兹 => 2256
印度 => 1641
波兰 => 1542
塞浦路斯 => 1360
印度尼西亚 => 1167
英属维尔京群岛 => 1113
瑞士 => 1091
马来西亚 => 1014
爱尔兰 => 892
乌克兰 => 557
塞舌尔 => 477
法国 => 437
瑞典 => 351
柬埔寨 => 294
西班牙 => 285
哈萨克斯坦 => 283
保加利亚 => 263
丹麦 => 256
菲律宾 => 156
爱沙尼亚 => 153
卢森堡 => 144
捷克 => 124
马耳他 => 123
奥地利 => 122
越南 => 114
阿联酋 => 95
泰国 => 55
挪威 => 34
新西兰 => 33
蒙古 => 21
马恩岛 => 19
伊拉克 => 14
泽西岛 => 12
斯洛文尼亚 => 9
关岛 => 6
意大利 => 4
以色列 => 2
老挝 => 2
孟加拉 => 2
土库曼斯坦 => 1
文莱 => 1
埃及 => 1
墨西哥 => 1
阿富汗 => 1
接着是我们 IPIP 的数据情况,执行耗时 90 秒左右(内存缓存模式 15 秒左右):
中国 => 1303057
其它 => 797837
亚太地区 => 3810
美国 => 355
俄罗斯 => 290
欧洲地区 => 139
日本 => 134
新加坡 => 29
菲律宾 => 14
泰国 => 6
蒙古 => 5
英国 => 5
巴西 => 5
柬埔寨 => 5
关岛 => 5
智利 => 4
爱尔兰 => 3
西班牙 => 2
老挝 => 2
瑞士 => 2
印度 => 1
土耳其 => 1
德国 => 1
法国 => 1
南非 => 1
孟加拉 => 1
阿富汗 => 1
备注:其中的“其它”数据为实际标注为 ANYCAST (也就是大家常看到的域名标注)以及各种骨干网络的情况,数量上以 ANYCAST 情况为主。
另外,我的朋友看过文章预览之后,强烈建议我加上纯真的测试,我想想也是,毕竟前几天我在朋友圈吐槽了某技术人员的言论,如下图:
而且等着跑 MXXXXXX 的数据的时间实在是无聊,那就写出来试试呗。
跑完了就发现自己忘记了最早为什么要自己做数据时想避开的那个坑了,地理位置标注很随意,结果是这样的:
所以就不给出具体结果了,大家看图片参考一下就好了。
出一个比较直观的结论:同样的数据源,MXXXXXX 只标注了 57 万个 IP 到中国,IP2XXXXXXXX 标注了 113 万个,而我们标注了 130 万个。而错误量最大的美国标注,MXXXXXX 标注了 91 万个,IP2XXXXXXXX 标注了 86 万个,而我们只有相差数量级的 355 个。其它的都算是小问题了。
我们只用了八年时间,做到了别人二十年都没有做到的事情。
至于数据错误带来的影响嘛,请参考一句话,冤假错案,是加倍的错误,冤枉了好人,放过了坏人。我想在这里也同样适用。
至于很多人心心念念的性价比问题,请邮件咨询他们的 Commercial Use 的价格。要明白,质量层面的每个百分比的提高,成本很大可能是指数级增长的,更何况并不是有人有钱就一定能做到的。。。
还要说,这只是一个以香港数据为中心的例子,实际上,我们全球监测网络里能看到的所有区域,问题都是类似的,只能说,不用心的话,在哪里都不用心。
最终,数据的质量,要靠踏踏实实的想办法解决问题,而且是长期的解决问题,而不是靠好看的 ppt 和嘴炮般的销售驱动。
反正如果我是数据采购方,我只会买对的哪怕是贵的,而不会买质量差虽然看着便宜的。
为了避免杠精,说我们也有问题,把上面的一段话再重复一次!因为监测数据有自身的检测周期,所以有一定量的小数量看似错误的标注,其中也包括一些卫星网络地面站的 IP,不一定算是真的错误。
欢迎有价值的探讨,有兴趣的请留言给我。
统一说明:
1、四个 IP 数据库都是最新版本。两个同行的都是官方代码。
2、国内其它同行我们没有数据,所以对这个有兴趣做对比的可以找我索取原始数据自行对比。
3、执行时间由 PHP 在 WINDOWS10 命令行下执行,版本 8.1.0 RC3,CPU 为 Intel Xeon W-10855M。
4、我们的 IPDB 数据库的 PHP 读取代码新版本会支持内存缓存模式,比我们自己现有默认的文件读取方式快 6 倍,即将发布。当然这个模式应该只适用于命令行方式,但是速度快了,总是可以帮助大家节省时间,提高效率,我花点时间优化一下也是值得的。至于比同行快多少倍,各位可以自己心算一下。